package pl.egraveyard.assembler;

import org.apache.commons.lang.Validate;

import pl.egraveyard.command.MyAccountCommand;
import pl.egraveyard.command.RegisterCommand;
import pl.egraveyard.domain.Klient;
import pl.egraveyard.domain.Uzytkownik;

/**
 * Klasa assembler dla klasy {@link Uzytkownik}
 * @author gunos
 *
 */
public final class OsobaAssembler {
	private AdresAssembler adresAssembler;

	/**
	 * @param adresAssembler the adresAssembler to set
	 */
	public void setAdresAssembler(AdresAssembler adresAssembler) {
		this.adresAssembler = adresAssembler;
	}

	/**
	 * Domyslny konstruktor
	 */
	private OsobaAssembler(){
	}
	
	/**
	 * Konwertuje obiekt user na obiekt command
	 * @param user obiekt docelowy
	 * @param cmd obiekt zrodlowy
	 */
	public void convertUser2Cmd(Uzytkownik user, MyAccountCommand cmd){
		cmd.setId(user.getId());
		cmd.setLogin(user.getLogin());
		cmd.setName(user.getImie());
		cmd.setSurename(user.getNazwisko());
		cmd.setPassword(user.getHaslo());
		cmd.setRepeatedPassword(user.getHaslo());
		cmd.setPersonalNumber(user.getPesel());
		adresAssembler.convertAdres2Cmd(cmd, user.getAdres());
	}
	
	/**
	 * Konwertuje obiekt {@link Klient} na Obiekt {@MyAccountCommand}
	 * @param klient obiekt zrodlowy
	 * @param cmd obiekt docelowy
	 */
	public void convertCustomer2Cmd(Klient klient, MyAccountCommand cmd){
		convertUser2Cmd(klient, cmd);
		cmd.setTelephoneNumber(klient.getTelefonKontaktowy());
	}
	
	/**
	 * Tworzy obiekt {@link Uzytkownik} na podstawie informacji z obiektu {@link MyAccountCommand}
	 * @param cmd obiekt zrodlowy
	 * @return obiekt klasy {@link Uzytkownik}
	 */
	public Uzytkownik convertCmd2User(MyAccountCommand cmd){
		Validate.notNull(cmd);
		Uzytkownik user = new Uzytkownik();
		user.setId(cmd.getId());
		user.setLogin(cmd.getLogin());
		user.setImie(cmd.getName());
		user.setNazwisko(cmd.getSurename());
		user.setHaslo(cmd.getPassword());
		user.setPesel(cmd.getPersonalNumber());
		user.setAdres(adresAssembler.convertCmd2Adres(cmd));
		return user;
	}
	
	/**
	 * Tworzy nieaktywny obiekt {@link Uzytkownik} na podstawie danych 
	 * z obiektu {@link RegisterCommand}
	 * @param cmd obiekt zrodlowy
	 * @return obiekt klasy {@link Uzytkownik}
	 */
	public Uzytkownik convertCmd2User(RegisterCommand cmd){
		Validate.notNull(cmd);
		Uzytkownik user = new Uzytkownik();
		user.setLogin(cmd.getLogin());
		user.setImie(cmd.getName());
		user.setNazwisko(cmd.getSurename());
		user.setHaslo(cmd.getPassword());
		user.setPesel(cmd.getPersonalNumber());
		user.setAdres(adresAssembler.convertCmd2Adres(cmd));
		return user;
	}
	
	/**
	 * Tworzy nowy obiekt klasy {@link Klient} na podstawie danych z obiektu {@link RegisterCommand}
	 * @param cmd obiekt zrodlowy
	 * @return obiekt klienta
	 */
	public Klient convertCmd2Customer(RegisterCommand cmd){
		Validate.notNull(cmd);
		Klient klient = new Klient();
		klient.setLogin(cmd.getLogin());
		klient.setImie(cmd.getName());
		klient.setNazwisko(cmd.getSurename());
		klient.setHaslo(cmd.getPassword());
		klient.setPesel(cmd.getPersonalNumber());
		klient.setTelefonKontaktowy(cmd.getTelephoneNumber());
		klient.setAdres(adresAssembler.convertCmd2Adres(cmd));
		return klient;
	}
	
	/**
	 * Tworzy nowy obiekt klasy {@link Klient} na podstawie danych z obiektu
	 * {@link MyAccountCommand}
	 * 
	 * @param cmd
	 *            obiekt zrodlowy
	 * @return obiekt klienta
	 */
	public Klient convertCmd2Customer(MyAccountCommand cmd){
		Validate.notNull(cmd);
		Klient klient = new Klient();
		klient.setId(cmd.getId());
		klient.setLogin(cmd.getLogin());
		klient.setImie(cmd.getName());
		klient.setNazwisko(cmd.getSurename());
		klient.setHaslo(cmd.getPassword());
		klient.setPesel(cmd.getPersonalNumber());
		klient.setTelefonKontaktowy(cmd.getTelephoneNumber());
		klient.setAdres(adresAssembler.convertCmd2Adres(cmd));
		return klient;
	}
	
}
